Supongamos que tengo una cadena (el lenguaje de programación puede ser PHP o js)
$s = "abcd";Quiero dividir esta cadena en subcadenas (no vacías) en 3 partes con todas las combinaciones posibles. Entonces la salida debe ser
$result = [ ["a", "b", "cd"], ["ab", "c", "d"], ["a", "bc", "d"] ]Probé con for loop, pero el valor se superpone y no quiero repetir la cadena.
<?php function solution($s) { $n = strlen($s); $result = []; for ($i = 0; $i < $n; $i++) { for ($j = $i + 1; $j < $n; $j++) { $s1 = substr($s, 0, $j); $s2 = substr($s, $i, $j); $s3 = substr($s, $j, $n); $temp = [$s1, $s2, $s3]; array_push($result, $temp); } } return $result; } $s = "abcd"; print_r(solution($s)); ?>Si tengo la idea de cómo podemos calcular la relación posible para un solo número, entonces tengo una solución lista que me da el resultado deseado.
<?php $possibleRatios = [ [1, 1, 2], [2, 1, 1], [1, 2, 1] ]; $result = []; for ($i = 0; $i < count($possibleRatios); $i++) { $element = $possibleRatios[$i]; $s1 = substr($s, 0, $element[0]); $s2 = substr($s, $element[0], $element[1]); $s3 = substr($s, $element[0] + $element[1], $element[2]); $temp = [$s1, $s2, $s3]; array_push($result, $temp); } print_r($result);En mi caso, la longitud de la cadena es 4, por lo que quiero la relación posible 1:1:2, 2:1:1, 1:2:1. Sé que las otras proporciones posibles pueden ser 0: 1: 3, 1: 0: 3, pero en realidad quiero omitir la combinación de subcadena vacía.
ejemplo en js
const string = "abcd"; const array = string.split(""); const output = array.reduce((carry, _, idx, arr) => { if (idx < arr.length - 1) { const str = arr[idx] + arr[idx + 1]; const subArray = [...arr]; subArray.splice(idx, 2, str); carry.push(subArray); } return carry; }, []); console.log(output);ejemplo en php
<?php $str = "abcd"; $array = str_split($str); $output = array_reduce($array, function ($carry) use ($array) { $idx = $carry['idx']; if ($idx < count($array) - 1) { $str = $array[$idx] . $array[$idx + 1]; $subArray = $array; array_splice($subArray, $idx, 2, $str); $carry['output'][] = $subArray; } $carry['idx'] += 1; return $carry; }, ['output' => [], 'idx' => 0])['output']; var_dump($output);